﻿#include "Queue.h"

// 队列-工具函数
// 申请节点
ListNode* BuyListNode(QueueDataType data)
{
	ListNode* node = (ListNode*)malloc(sizeof(ListNode));
	if (node == NULL)
	{
		printf("malloc error\n");
		exit(-1);
	}
	node->data = data;
	node->next = NULL;
	return node;
}

// 队列-基本操作函数
// 初始化队列
void QueueInit(Queue* queue)
{
	assert(queue);
	queue->head = queue->tail = NULL;
}
// 队尾插入 / 入队
void QueuePush(Queue* queue, QueueDataType data)
{
	assert(queue);
	if (queue->head == NULL)
	{
		queue->head = queue->tail = BuyListNode(data);
	}
	else
	{
		queue->tail->next = BuyListNode(data);
		queue->tail = queue->tail->next;
	}
}
// 队头弹出 / 出队
void QueuePop(Queue* queue)
{
	assert(queue);
	assert(queue->head);
	ListNode* del = queue->head;
	if (queue->head == queue->tail)
	{
		queue->head = queue->tail = NULL;
	}
	else
	{
		queue->head = del->next;
	}
	free(del);
}
// 获取队头元素
QueueDataType QueueFront(Queue* queue)
{
	assert(queue);
	assert(queue->head);
	return queue->head->data;
}
// 获取队尾元素
QueueDataType QueueBack(Queue* queue)
{
	assert(queue);
	assert(queue->tail);
	return queue->tail->data;
}
// 获取队列中有效元素个数
size_t QueueSize(Queue* queue)
{
	assert(queue);
	size_t count = 0;
	ListNode* cur = queue->head;
	while (cur)
	{
		count++;
		cur = cur->next;
	}
	return count;
}
// 判断队列是否为空 为空返回非0 不为空返回0
int QueueEmpty(Queue* queue)
{
	assert(queue);
	return queue->head == NULL;
}
// 销毁队列
void QueueDestory(Queue* queue)
{
	assert(queue);
	ListNode* cur = queue->head;
	while (cur)
	{
		ListNode* del = cur;
		cur = cur->next;
		free(del);
	}
	queue->head = queue->tail = NULL;
}